Nachdem GerVADER2 die Sentimente aller Sätze im Korpus erkannt und wir im vorherigen Schritt alle objektiven Wörter auf Sentiment-Tendenzen untersucht haben, können die annotierten Sentiment-Werte nun auf höhere Ebenen (von Sätze zu Kommentaren, Blogs und Kampagnen) akkumuliert werden.
if (!require(readr)) {install.packages(readr)}; library(readr)
if (!require("tidytext")) {install.packages("tidytext")}; library("tidytext")
if (!require("textdata")) {install.packages("textdata")}; library("textdata")
if (!require("dplyr")) {install.packages("dplyr")}; library("dplyr")
if (!require("ggplot2")) {install.packages("ggplot2")}; library("ggplot2")
if (!require("tidyr")) {install.packages("tidyr")}; library("tidyr")
if (!require("stringr")) {install.packages("stringr")}; library("stringr")
if (!require("psych")) {install.packages("psych")}; library("psych")
if (!require("glue")) {install.packages("glue")}; library("glue")
filePath = "./data/GerVader2_adjusted_sentences.tsv"
GerVader2_sentences <- read_tsv(file = filePath)
Rows: 1974909 Columns: 12
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (1): comment_text
dbl (10): project_id, blog_id, comment_id, sentence_id, compound, neg, neu, pos, wordCount, compound_alt
lgl (1): is_moderator
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
GerVader2_sentences
Hier wird eine Funktion verwendet, die die Daten in Werte zwischen -1 und 1 skaliert. Zusätzlich wird ein Alpha-Wert verwendet, der die Verteilung der Werte optisch verständlicher macht. Je höher Alpha, desto stärker werden die Unterschiede zwischen den stärkeren Sentimenten erkennbar.
# das ist die von GerVADER verwendete Normalisiserungsfunktion
normalizeScore <- function(score, alpha=30){
score_norm = score / sqrt(score ^ 2 + alpha)
if (score_norm > 1){score_norm=1}
if (score_norm <= -1){score_norm=-1}
return (score_norm)
}
alpha = 40
# starte mit Sentimente pro Satz
GerVader2_comments_nn <- GerVader2_sentences %>%
select(!c(neg, neu, pos)) %>%
group_by(project_id, blog_id, comment_id, is_moderator) %>%
# füge die Texte der Sätze zu Kommentaren zusammen
mutate(
comment_text = Reduce(f=paste, x=comment_text),
) %>%
group_by(project_id, blog_id, comment_id, is_moderator, comment_text) %>%
# errechne die Sentimentsummen der Kommentare und die Wortanzahl
summarize(
compound_alt = sum(compound_alt, na.rm=TRUE),
compound = sum(compound, na.rm=TRUE),
wordCount = sum(wordCount, na.rm=TRUE)
)
`summarise()` has grouped output by 'project_id', 'blog_id', 'comment_id', 'is_moderator'. You can override using the `.groups` argument.
GerVader2_comments <- GerVader2_comments_nn %>%
# normalisiere die Sentimentsummen mit einem gegebenen Alphawert
mutate(
compound_alt = normalizeScore(compound_alt, alpha),
compound = normalizeScore(compound, alpha)
) %>%
# lade the Metadaten der Kommentare
inner_join(comments %>% select(project_id, blog_id, comment_id, comment_author))
Joining, by = c("project_id", "blog_id", "comment_id")
GerVader2_comments
In den folgenden Plots werden die Verteilung und Dichte der Sentimente der Kommentare, jeweils vor und nach der Berücksichtigung der Sentiment-Tendenzen objektiver Worte, gezeigt.
# Verteilung der Sentiment-Kommentare vor Berücksichtigung der Tendenzen objektiver Worte
GerVader2_comments$compound_alt %>% hist(breaks=60, main="Verteilung Kommentare-Sentiment vor objektive Worten")
# Verteilung der Sentiment-Kommentare nach Berücksichtigung der Tend enzen objektiver Worte
GerVader2_comments$compound %>% hist(breaks=60, main="Verteilung Kommentare-Sentiment nach objektive Worten")
# Dichtefunktion der Sentiment-Kommentare
plot(density(GerVader2_comments$compound_alt), main="Dichtefunktion Kommentar-Sentimente")
lines(density(GerVader2_comments$compound), col=2, lty=2, lwd=3)
Hier wird erneut die Verteilung der Kommentar-Sentimente gezeigt. Die rote, strichlierte Linie markiert den Sentiment-Mittelwert. Dieser liegt bei 0,478.
Ebenso werden hier die Kommentardaten nach rein positiven, negativen und neutralen Kommentaren gefiltert. Somit zeigt sich, dass 750.230 positive, 18.426 negative und, danke Schritt 4, keine neutralen Kommentare erkannt wurden.
GerVader2_comments %>%
ggplot(aes(x=compound)) +
geom_histogram(binwidth=0.05) +
geom_vline(aes(xintercept=mean(compound)), linetype="dashed", color = "red") +
ggtitle("Sentiment-Verteilung der Kommentare") +
labs(x="Sentimentwert", "Menge")
mean(GerVader2_comments$compound)
[1] 0.4787203
GerVader2_comments %>%
filter(compound > 0)
GerVader2_comments %>%
filter(compound < 0)
GerVader2_comments %>%
filter(compound == 0)
Hier wird gezeigt, dass es eine signifikante, positive Korrelation zwischen der Länge eines Kommentars und dem Sentiment gibt.
# Korrelation zwischen Sentiment und Wortanzahl
cor.test(GerVader2_comments$wordCount, GerVader2_comments$compound)
Pearson's product-moment correlation
data: GerVader2_comments$wordCount and GerVader2_comments$compound
t = 347.04, df = 768654, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.3661123 0.3699777
sample estimates:
cor
0.3680466
"Statistiken der Wortanzahlen"
[1] "Statistiken der Wortanzahlen"
summary(GerVader2_comments$wordCount)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 40.00 66.00 79.71 103.00 2168.00
Es gibt eine schwache, signifikante, positive Korrelation von 0,26 zwischen den erkannten Sentimenten von Kommentaren und ihrer Länge.
Der Effekt des Normalisierungsparameters Alpha wird im folgenden visualisiert. Bei kleinem Alpha ist die starke Tendenz zu sehr positiven Kommentaren sichtbar, Unterschiede zwischen den positiven Kommentaren sind schwerer erkennbar. Durch ein größeres Alpha werden die Abstände zwischen den sehr positiven Kommentaren scheinbar größer.
alpha_1 <- GerVader2_comments_nn$compound %>%
as.data.frame() %>%
mutate(compound = normalizeScore(., 1))%>% mutate(alpha = 1)
Bedingung hat Länge > 1 und nur das erste Element wird benutztBedingung hat Länge > 1 und nur das erste Element wird benutzt
alpha_15 <- GerVader2_comments_nn$compound %>%
as.data.frame() %>%
mutate(compound = normalizeScore(., 15))%>% mutate(alpha = 15)
Bedingung hat Länge > 1 und nur das erste Element wird benutztBedingung hat Länge > 1 und nur das erste Element wird benutzt
alpha_40 <- GerVader2_comments_nn$compound %>%
as.data.frame() %>%
mutate(compound = normalizeScore(., 40))%>% mutate(alpha = 40)
Bedingung hat Länge > 1 und nur das erste Element wird benutztBedingung hat Länge > 1 und nur das erste Element wird benutzt
alpha_90 <- GerVader2_comments_nn$compound %>%
as.data.frame() %>%
mutate(compound = normalizeScore(., 90))%>% mutate(alpha = 90)
Bedingung hat Länge > 1 und nur das erste Element wird benutztBedingung hat Länge > 1 und nur das erste Element wird benutzt
alpha_200 <- GerVader2_comments_nn$compound %>%
as.data.frame() %>%
mutate(compound = normalizeScore(., 200))%>% mutate(alpha = 200)
Bedingung hat Länge > 1 und nur das erste Element wird benutztBedingung hat Länge > 1 und nur das erste Element wird benutzt
alpha_30 <- GerVader2_comments_nn$compound %>%
as.data.frame() %>%
mutate(compound = normalizeScore(., 30))%>% mutate(alpha = 30)
Bedingung hat Länge > 1 und nur das erste Element wird benutztBedingung hat Länge > 1 und nur das erste Element wird benutzt
alpha_scores <- rbind(alpha_1, alpha_15, alpha_30, alpha_40, alpha_90, alpha_200 )
alpha_scores %>%
ggplot( aes(x=compound, color=alpha, fill=alpha)) +
geom_histogram(alpha=.7, binwidth = 0.05) +
facet_wrap(~alpha) +
ggtitle("Sentimentverteilung der Kommentare für Alpha-Werte") +
xlab("Sentiment") + ylab("")
Die folgenden Shapiro-Wilk-Tests ergeben, dass die Kommentar-Sentimente weder vor noch nach der Berücksichtigung der Sentiment-Tendenzen der objektiven Worte annähernd normalverteilt ist.
shapiro.test(GerVader2_comments$compound %>% sample(5000))
Shapiro-Wilk normality test
data: GerVader2_comments$compound %>% sample(5000)
W = 0.97549, p-value < 2.2e-16
shapiro.test(GerVader2_comments$compound_alt %>% sample(5000))
Shapiro-Wilk normality test
data: GerVader2_comments$compound_alt %>% sample(5000)
W = 0.95201, p-value < 2.2e-16
Hier werden die durchschnittlichen Sentimente der Kommentare pro Blog errechnet.
GerVader_per_blog <- GerVader2_comments %>%
# lade die Metadaten der Blogeinträge
inner_join(blogs, by=c("project_id", "blog_id")) %>%
group_by(project_id, blog_id, author, n_comments) %>%
# errechne die Sentiment-Mittelwerte pro blog_id
summarize(
SentimentMean = mean(compound, na.rm = TRUE),
SentimentMean_alt = mean(compound_alt, na.rm = TRUE),
) %>%
# lade die Kampagnen-Metadaten (Teilnehmeranzahl)
inner_join(projects %>% select(project_id, participants), by=c("project_id"))
`summarise()` has grouped output by 'project_id', 'blog_id', 'author'. You can override using the `.groups` argument.
GerVader_per_blog
Hier wird die Verteilung der der Blogeintrag-Sentimente visualisiert und auf Normalverteilung getestet. Das durchschnittlich Sentiment der Blogeintrag-Kommentare beträgt 0,493.
Der Shapiro-Wilk-Test weist nach, dass die Blogeintrag-Sentimente nicht annähernd normalverteilt sind.
# Verteilung der Blogeintrag-Sentimente
GerVader_per_blog %>%
ggplot(aes(x=SentimentMean)) +
geom_histogram(binwidth=0.01) +
geom_vline(aes(xintercept=mean(SentimentMean)), linetype="dashed", color = "red") +
ggtitle("Sentiment-Verteilung der Blogeinträge") +
labs(x="Sentimentwert", "Menge")
# Teste die Verteilung der Blogeintrag-Sentimente auf Normalverteilung
shapiro.test(GerVader_per_blog$SentimentMean)
Shapiro-Wilk normality test
data: GerVader_per_blog$SentimentMean
W = 0.99613, p-value = 4.302e-06
"Mittelwert der durhcschnittlichen Blogeintrag-Sentimente"
[1] "Mittelwert der durhcschnittlichen Blogeintrag-Sentimente"
mean(GerVader_per_blog$SentimentMean)
[1] 0.4932989
Auch für die Analyse der Kampagnen werden die Sentimente der Kommentare nach Kampagnen gruppiert und ihr Mittelwert berechnet.
GerVader_per_project <- GerVader2_comments %>%
group_by(project_id) %>%
summarize(
# errechne die Sentimentsumme und den Sentimentdurchschnitt
SentimenSum = sum(compound),
SentimentMean = mean(compound, na.rm = TRUE),
SentimentMean_alt = mean(compound_alt, na.rm = TRUE),
# errechne die Wortanzahl der Kommentare der Kampagne
wordCount = sum(wordCount),
# errechne die Anzahl an Kommentaren in einer Kampagne
commentCount = n()
) %>%
# lade die Metadaten der Kampagnen, Kampagnenergebnisse und Blogeinträge
inner_join(projects, by="project_id") %>%
inner_join(results, by="project_id") %>%
left_join(
blogs %>% group_by(project_id, author) %>% summarize(n=n()) %>% select(project_id, author),
by="project_id"
) %>%
left_join(
blogs %>% group_by(project_id) %>% summarize(blogCount=n()) %>% select(project_id, blogCount),
by="project_id"
) %>%
# errechne die durchschnittliche Anzahl an Kommentaren pro Kampagnenteilnehmer
# nenne das Ergebnis "engagement"
mutate(engagement = commentCount / participants)
`summarise()` has grouped output by 'project_id'. You can override using the `.groups` argument.
# errechne die Laufzeit des Projekts
getRuntime <- function(start,end){
start = strsplit(start, "[.]")
start_day = (start[[1]][1]) %>% as.numeric()
start_month = (start[[1]][2]) %>% as.numeric()
start_year = (start[[1]][3]) %>% as.numeric()
end = strsplit(end, "[.]")
end_day = (end[[1]][1]) %>% as.numeric()
end_month = (end[[1]][2]) %>% as.numeric()
end_year = (end[[1]][3]) %>% as.numeric()
return ((end_day+end_month*30+end_year*365)-(start_day+start_month*30+start_year*365))
}
GerVader_per_project$runtime = mapply(getRuntime, GerVader_per_project$start_date, GerVader_per_project$end_date)
GerVader_per_project
summary(GerVader_per_project)
project_id SentimenSum SentimentMean SentimentMean_alt wordCount commentCount
Min. : 17.0 Min. : 60.07 Min. :0.3583 Min. :0.1267 Min. : 8661 Min. : 120
1st Qu.:113.0 1st Qu.: 419.06 1st Qu.:0.4586 1st Qu.:0.2318 1st Qu.: 69991 1st Qu.: 890
Median :181.0 Median : 883.26 Median :0.4849 Median :0.2622 Median : 145794 Median : 1876
Mean :176.4 Mean : 1497.77 Mean :0.4834 Mean :0.2589 Mean : 250554 Mean : 3118
3rd Qu.:250.0 3rd Qu.: 2009.57 3rd Qu.:0.5108 3rd Qu.:0.2893 3rd Qu.: 335872 3rd Qu.: 4204
Max. :304.0 Max. :16501.41 Max. :0.6131 Max. :0.3791 Max. :3198270 Max. :34485
...1 Unnamed: 0 Unnamed: 0.1 Unnamed: 0.1.1 href category
Min. : 16.0 Min. : 16.0 Min. : 16.0 Min. : 16.0 Mode:logical Length:221
1st Qu.:112.0 1st Qu.:112.0 1st Qu.:112.0 1st Qu.:112.0 NA's:221 Class :character
Median :180.0 Median :180.0 Median :180.0 Median :180.0 Mode :character
Mean :175.4 Mean :175.4 Mean :175.4 Mean :175.4
3rd Qu.:249.0 3rd Qu.:249.0 3rd Qu.:249.0 3rd Qu.:249.0
Max. :303.0 Max. :303.0 Max. :303.0 Max. :303.0
title description start_date end_date participants weiterempfehlungsquote
Length:221 Mode:logical Length:221 Length:221 Min. : 20 Min. : 75.00
Class :character NA's:221 Class :character Class :character 1st Qu.: 550 1st Qu.: 91.00
Mode :character Mode :character Mode :character Median : 1500 Median : 93.00
Mean : 2177 Mean : 92.51
3rd Qu.: 3000 3rd Qu.: 96.00
Max. :11000 Max. :100.00
NA's :114 NA's :16
rating_value review_count content author blogCount engagement
Min. :3.500 Min. : 20 Length:221 Length:221 Min. : 3.00 Min. : 0.3009
1st Qu.:4.400 1st Qu.: 409 Class :character Class :character 1st Qu.: 8.00 1st Qu.: 0.6957
Median :4.500 Median : 895 Mode :character Mode :character Median :10.00 Median : 0.9231
Mean :4.451 Mean :1630 Mean :11.72 Mean : 5.5875
3rd Qu.:4.600 3rd Qu.:2335 3rd Qu.:15.00 3rd Qu.: 2.3508
Max. :4.800 Max. :8357 Max. :32.00 Max. :252.7500
NA's :160 NA's :160 NA's :114
runtime
Min. : 27.00
1st Qu.: 43.00
Median : 48.00
Mean : 54.05
3rd Qu.: 57.00
Max. :359.00
Hier werden die Verteilung der Kampagnen-Sentimente visualisiert und auf Normalverteilung getestet. Die Kampagnen haben im Schnitt durchschnittliche Kommentar-Sentimente von 0,483.
Der Shapiro-Wilk-Test ergibt, dass die durchschnittlichen Kommentar-Sentimente pro Kampagne annähernd normalverteilt sind.
GerVader_per_project %>%
ggplot(aes(x=SentimentMean)) +
geom_histogram(binwidth=0.005) +
geom_vline(aes(xintercept=mean(SentimentMean)), linetype="dashed", color = "red") +
ggtitle("Sentiment-Verteilung der Projekte") +
labs(x="Sentimentwert", "Menge")
"Durchschnittliche Kampagnen-Sentimente"
[1] "Durchschnittliche Kampagnen-Sentimente"
mean(GerVader_per_project$SentimentMean)
[1] 0.4833905
"Negativster Kampagnen-Sentiment-Mittelwert"
[1] "Negativster Kampagnen-Sentiment-Mittelwert"
min(GerVader_per_project$SentimentMean)
[1] 0.3582805
# Teste die Kampagnen-Sentimente auf Normalverteilung
shapiro.test(GerVader_per_project$SentimentMean)
Shapiro-Wilk normality test
data: GerVader_per_project$SentimentMean
W = 0.99447, p-value = 0.5955
Im folgenden werden die Ergebnisse der Kampagnen, also der erkannten Sentiment, den durchschnittlichen Kundenbewertungen und den durchschnittlichen Weiterempfehlungsquoten, auf Korrelation miteinander und mit anderen Variablen, nämlich der Anzahl an Blgoeinträgen und Teilnehmern pro Kampagne, der Laufzeit jeder Kampagne und dem Engagement, dass die Teilnehmer im Schnitt zeigten.
GerVader_per_project %>%
select(
SentimentMean,
weiterempfehlungsquote,
rating_value,
blogCount,
participants,
runtime,
engagement
) %>%
pairs.panels()
Im folgenden werden die entdeckten Korrelationen auf Signifikanz getestet.
Es gibt ein signifikante, wenn auch nicht starke, Korrelation zwischen den durch GerVader2 erkannten, durchschnittlichen Sentimenten der Projekte und ihren Weiterempfehlungsraten (0,20) und Bewertungen (0,33).
Ebenso gibt es eine signifikante, schwach negative Korrelation (-0,24) zwischen dem Sentiment der Kommentare pro Kampagne und der Anzahl an Blogeinträgen über die Kampagnenlaufzeit.
cor.test(GerVader_per_project$SentimentMean, GerVader_per_project$weiterempfehlungsquote)
Pearson's product-moment correlation
data: GerVader_per_project$SentimentMean and GerVader_per_project$weiterempfehlungsquote
t = 2.8702, df = 203, p-value = 0.004536
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.06212901 0.32570350
sample estimates:
cor
0.1974827
cor.test(GerVader_per_project$SentimentMean, GerVader_per_project$rating_value)
Pearson's product-moment correlation
data: GerVader_per_project$SentimentMean and GerVader_per_project$rating_value
t = 2.6854, df = 59, p-value = 0.009393
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.08528372 0.53719411
sample estimates:
cor
0.3300169
cor.test(GerVader_per_project$SentimentMean, GerVader_per_project$blogCount)
Pearson's product-moment correlation
data: GerVader_per_project$SentimentMean and GerVader_per_project$blogCount
t = -3.5894, df = 219, p-value = 0.000409
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.3565949 -0.1070762
sample estimates:
cor
-0.2357165
cor.test(GerVader_per_project$SentimentMean, GerVader_per_project$participants)
Pearson's product-moment correlation
data: GerVader_per_project$SentimentMean and GerVader_per_project$participants
t = -1.8717, df = 105, p-value = 0.06404
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.35735059 0.01053485
sample estimates:
cor
-0.179683
cor.test(GerVader_per_project$SentimentMean, GerVader_per_project$runtime)
Pearson's product-moment correlation
data: GerVader_per_project$SentimentMean and GerVader_per_project$runtime
t = 1.2796, df = 219, p-value = 0.202
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.04635365 0.21566402
sample estimates:
cor
0.08614457
cor.test(GerVader_per_project$SentimentMean, GerVader_per_project$engagement)
Pearson's product-moment correlation
data: GerVader_per_project$SentimentMean and GerVader_per_project$engagement
t = 1.3629, df = 105, p-value = 0.1758
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.05950816 0.31384245
sample estimates:
cor
0.1318398
Nun werden die angeblich signifikanten Korrelationen genauer visualisiert.
GerVader_per_project %>%
ggplot(aes(weiterempfehlungsquote, SentimentMean)) +
geom_jitter() +
ggtitle("Korrelation zwischen Sentiment pro Projekt und Weiterempfehlungsrate")+
ylab("durchschn. Sentiment pro Projekt") + xlab("durchschn. Weiterempfehlungsrate")
GerVader_per_project %>%
ggplot(aes(rating_value, SentimentMean)) +
geom_jitter() +
ggtitle("Korrelation zwischen Sentiment pro Projekt und Kundenbewertung")+
ylab("durchschn. Sentiment pro Projekt") + xlab("durchschn. Kundenbewertung")
GerVader_per_project %>%
ggplot(aes(blogCount, SentimentMean)) +
geom_jitter() +
ggtitle("Korrelation zwischen Sentiment pro Projekt und Anzahl an Blogeinträgen")+
ylab("durchschn. Sentiment pro Projekt") + xlab("Blogeinträge")
Im folgenden werden pro Domäne die durchschnittlichen Sentimente, Teilnehmerbewertungen, Weiterempfehlungsquoten und die Varianz der Sentimente berechnet.
"Domänen der Kampagnen"
[1] "Domänen der Kampagnen"
projects$category %>% unique()
[1] "Haushalt & Reinigung" "Tiere" "Freizeit & Reisen" "Beauty & Pflege"
[5] "Technik & Online" "Food & Snacks" "Getränke" "Sonstiges"
[9] "Gesundheit" "Shops"
GerVader2_per_category <- GerVader2_comments %>%
# lade Metadaten der Kampagnen und ihrer Ergebnisse
inner_join(projects, by="project_id") %>%
inner_join(results, by="project_id") %>%
group_by(category) %>%
# Statistikenpro Domäne
summarize(
# Sentiment-Mittelwert
SentimentMean = mean(compound, na.rm = TRUE),
# Kommentaranzahl
comment_count = n(),
# durchschnittliche Teilnehmerbewertung
RatingMean = mean(rating_value, na.rm=TRUE),
# durchschnittliche Weiterempfehlungsrate
WeiterempfehlungsquoteMean = mean(weiterempfehlungsquote, na.rm=TRUE),
# Varianz der Sentimente
variance = var(compound, na.rm=TRUE)
) %>%
arrange(desc(SentimentMean))
GerVader2_per_category
GerVader2_per_category$SentimentMean %>% barplot(legend=GerVader2_per_category$category)
Hier wird das jeweilige Engagement der Teilnehmer pro Kampagnenmanager gezeigt.
GerVader_per_project %>%
select(project_id, author, engagement) %>%
arrange(desc(engagement))
Hier wird ein Datensatz mit den durchschnittlichen Kommentar-Sentimenten, Teilnehmerbewertungen und Weiterempfehlungsquoten pro Kampagnenmanager, sowie der Anzahl verwalteter Kampagnen und dem angeregten Engagement, also der durchschnittlichen Anzahl an Kommentaren, errechnet.
GerVader_projects_per_author <- GerVader_per_project %>%
group_by(author) %>%
summarise(
SentimentMean = mean(SentimentMean, na.rm = TRUE),
weiterempfehlungsquote = mean(weiterempfehlungsquote, na.rm = TRUE),
rating_value = mean(rating_value, na.rm = TRUE),
n_projects = n(),
engagement = mean(commentCount / participants, na.rm = TRUE)
) %>%
arrange(desc(SentimentMean))
GerVader_projects_per_author
Hier werden die Erfolgsmetriken pro Kampagnenmanager auf Korrelationen untersucht.
GerVader_projects_per_author %>%
select(
SentimentMean,
weiterempfehlungsquote,
rating_value,
n_projects,
engagement
) %>%
pairs.panels()
Die Korrelationen sind allesamt nicht signifikant. Das könnte auch daran liegen, dass nur sehr wenige verschiedene Kampagnenmanager in den Daten vorliegen, vielleicht ergeben sich im großen Ganzen signifikantere Trends.
cor.test(GerVader_projects_per_author$SentimentMean, GerVader_projects_per_author$weiterempfehlungsquote)
Pearson's product-moment correlation
data: GerVader_projects_per_author$SentimentMean and GerVader_projects_per_author$weiterempfehlungsquote
t = 0.23743, df = 35, p-value = 0.8137
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.2876554 0.3594497
sample estimates:
cor
0.04010124
cor.test(GerVader_projects_per_author$SentimentMean, GerVader_projects_per_author$rating_value)
Pearson's product-moment correlation
data: GerVader_projects_per_author$SentimentMean and GerVader_projects_per_author$rating_value
t = 0.93286, df = 13, p-value = 0.3679
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.3003172 0.6760036
sample estimates:
cor
0.2504798
cor.test(GerVader_projects_per_author$SentimentMean, GerVader_projects_per_author$n_projects)
Pearson's product-moment correlation
data: GerVader_projects_per_author$SentimentMean and GerVader_projects_per_author$n_projects
t = 1.5713, df = 35, p-value = 0.1251
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.07343163 0.53612248
sample estimates:
cor
0.256695
cor.test(GerVader_projects_per_author$rating_value, GerVader_projects_per_author$n_projects)
Pearson's product-moment correlation
data: GerVader_projects_per_author$rating_value and GerVader_projects_per_author$n_projects
t = -0.76534, df = 13, p-value = 0.4577
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.6506912 0.3408811
sample estimates:
cor
-0.20764
cor.test(GerVader_projects_per_author$weiterempfehlungsquote, GerVader_projects_per_author$engagement)
Pearson's product-moment correlation
data: GerVader_projects_per_author$weiterempfehlungsquote and GerVader_projects_per_author$engagement
t = 1.4362, df = 18, p-value = 0.1681
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.1420323 0.6683323
sample estimates:
cor
0.3206415
Als nächstes werden die Kommentar-Sentimente der Blogeinträge jeder Kampagne visualisiert, um Sentiment-Trends über die Kampagnenentwicklung erkennbar zu machen.
# Funktion zur Visualisierung von Sentiment-Entwicklungen einer Kampagne
SentimentEntwicklung <- function(GerVader_per_blog, project_ids=c(1:100000000), showLegend=TRUE, opacity=1, points=TRUE, title="") {
GerVader_per_blog %>%
mutate(
project_id = factor(project_id),
) %>%
filter(project_id %in% project_ids) %>%
ggplot(aes(blog_id_alt, SentimentMean, color=project_id)) +
geom_line(alpha=opacity, show.legend = showLegend) +
geom_point(show.legend = showLegend, alpha=points) +
ggtitle(glue("Sentiment-Entwicklung für Kampagne(n) {title}")) +
xlab("Blog ID") +
geom_point() %>%
print()
}
# Kampagne 17
SentimentEntwicklung(GerVader_per_blog, project_ids=17, title="#17")
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity
Fehler in FUN(X[[i]], ...) : Objekt 'blog_id_alt' nicht gefunden
Hier werden die Kampagnenmanager “lesofy” und insbesondere “nellisa” genauer unter die Lupe genommen.
Die Kampagne 198 hat, wie oben ersichtlich, ein Sentimenttief bei den ersten Blogeinträgen. Das wird hier genauer untersucht.
Die folgende Grafik zeigt, dass es während dem Tief der durchschnittlichen Sentimente (türkis) der ersten Blogeinträge auch relativ viele negative Kommentare (orange, strichliert) gab.
Die folgende Grafik zeigt, dass es während dem Tief der durchschnittlichen Sentimente (türkis) auch relativ weniger sehr positive Kommentare (pink, strichliert) gab.
Hier werden nun die Anzahl der Kommentare pro Blogeintrag der Kampagne 198 visualisiert. Bei Blogeintrag 7 gibt es besonders viele Kommentare, darum wird mittels Histogramm die Verteilung der Kommentar-Sentimente in Blogeintrag 7 der Kampagne 198 abgebildet.
Hier werden ein paar Blogs auf ihre negativsten Kommentare Stichprobenartig untersucht.
Die Teilnehmer nehmen veschieden oft an Kampagnen teil, schreiben verschieden lange und emotion unterschiedlich geladene Texte. Das wird hier untersucht.
Hier sind ein paar informative Plots zu den Verteilungen der Userkommentare.
Die Kommentare des Users “blackstar”, dessen Kommentare tendenziell negativ sind, werden hier herausgefiltert, damit sie inhaltlich analysiert werden können. Sie scheinen Beschwerden über Lieferprobleme zu enthalten.